home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Mac SampleCode Previous / Geometry Samples- Mac / Skinny3DSample / Skinny3DSources ƒ / SkinnyMain.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  8.6 KB  |  389 lines  |  [TEXT/MPS ]

  1.  
  2. #include <Printing.h>
  3. #include <AppleEvents.h>
  4. #include <Windows.h>
  5. #include <Fonts.h>
  6. #include <ToolUtils.h>
  7. #include <TextUtils.h>
  8. #include <LowMem.h>
  9. #include <SegLoad.h>
  10. #include <Devices.h>
  11. #include <Quickdraw.h>
  12.  
  13.  
  14. #include    "SkinnyMain.h"
  15. #include     "3DAppSpecific.h"
  16.  
  17. #define        kMinHeap    100000
  18.  
  19. enum { aboutBoxID = 129 }; // resource IDs
  20.  
  21. Boolean        gDone = false;                /* true when Quit is selected */
  22. Boolean        gInBackGround = false;        /* true if we are in the background */
  23. THPrint        gPrintH;
  24. CursHandle    gWatchCursor;
  25.  
  26. // local prototypes
  27. static void MainEventLoop(void);
  28. static void DoClick(EventRecord *evt);
  29.  
  30. static void DoKey(EventRecord *evt);
  31. static void DoUpdate(EventRecord *evt);
  32. static void DoActivate(EventRecord *evt);
  33. static void DoOSEvent(EventRecord *evt);
  34.  
  35. static void UpdateMenus(void);
  36. static void DoMenu(long msel);
  37. static void ChooseApple(short itemNumber);
  38. static void ChooseFile(short item);
  39. static void ChooseEdit(short item);
  40. static void DoPageSetup(void);
  41.  
  42. static OSErr InstallAEHandlers(void);
  43. static pascal OSErr AEOpenHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  44. static pascal OSErr AEOpenDocHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  45. static pascal OSErr AEPrintHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  46. static pascal OSErr AEQuitHandler(AppleEvent *messagein, AppleEvent *reply, long refIn);
  47.  
  48.  
  49. //==============================================================
  50. void main(void)
  51. {
  52.     long    masterBlocks = 10;
  53.     long     err;
  54.  
  55.     MaxApplZone();
  56.     while ( masterBlocks-- )
  57.         MoreMasters();
  58.  
  59.     InitGraf(&qd.thePort);
  60.     InitFonts();
  61.     InitWindows();
  62.     InitMenus();
  63.     InitCursor();
  64.     TEInit();
  65.     FlushEvents(everyEvent, 0);
  66.     InitDialogs(0L);
  67.     gWatchCursor = GetCursor(watchCursor);
  68.     if (!gWatchCursor)
  69.         return;
  70.     HNoPurge((Handle) gWatchCursor);
  71.  
  72.     err = InitializeApplication(); // app-specific
  73.     if (err != noErr) {
  74.         ErrMsg("\pInitialization failed.");
  75.         return;
  76.     }
  77.     
  78.     DoNew(); // app-specific
  79.     MainEventLoop();
  80.  
  81.     Cleanup();
  82. }
  83.  
  84.  
  85. //------------------------------------
  86. static void MainEventLoop(void)
  87. {
  88.     EventRecord    event;
  89.     Boolean        gotEvent;
  90.     long        grow;
  91.     
  92.     while    (!gDone) {
  93.         gotEvent = WaitNextEvent(everyEvent, &event, 10, nil);
  94.         if (gotEvent) {
  95.             switch(event.what) {
  96.                 case nullEvent:                                break;
  97.                 case mouseDown:        DoClick(&event);        break;
  98.                 case mouseUp:                                 break;
  99.                 case keyDown:        DoKey(&event);            break;
  100.                 case keyUp:                                     break;
  101.                 case autoKey:        DoKey(&event);            break;
  102.                 case updateEvt:        DoUpdate(&event);        break;
  103.                 case diskEvt:                                 break;
  104.                 case activateEvt:    DoActivate(&event);        break;
  105.                 case osEvt:            DoOSEvent(&event);        break;
  106.                 default:                                    break;
  107.             }
  108.         }
  109.         if (MaxMem(&grow) < kMinHeap) {
  110.         ErrMsg("\pSorry, need to quit (too many memory leaks)");
  111.         gDone = true;
  112.         }
  113.     }
  114. }
  115.  
  116.  
  117. //------------------------------------
  118. static void DoKey(EventRecord *evt)
  119. {
  120.     char c = (char)evt->message & charCodeMask;
  121.     
  122.     if ((evt->modifiers & cmdKey)) {
  123.         UpdateMenus();
  124.         DoMenu(MenuKey(evt->message & charCodeMask));
  125.     }
  126. }
  127.  
  128.  
  129. //------------------------------------
  130. static void DoUpdate(EventRecord *evt)
  131. {
  132.     WindowPtr    updateWindow;
  133.     GrafPtr        savePort;
  134.     
  135.     GetPort(&savePort);
  136.     updateWindow = (WindowPtr)evt->message;
  137.     SetPort(updateWindow);
  138.     BeginUpdate(updateWindow);                        
  139.  
  140.     DrawAppSpecificContent(updateWindow); // app-specific; erase as required
  141.  
  142.     EndUpdate(updateWindow);
  143.     SetPort(savePort);
  144. }
  145.  
  146.  
  147. //------------------------------------
  148. static void DoActivate(EventRecord *evt)
  149. {
  150.     ActivateWindow((WindowPtr)evt->message, (evt->modifiers & activeFlag));
  151. }
  152.  
  153. //------------------------------------
  154. static void DoOSEvent(EventRecord *evt)
  155. {
  156.     if ( (evt->message >> 24) == suspendResumeMessage)
  157.         gInBackGround = !(evt->message & resumeFlag);
  158. }
  159.  
  160. //------------------------------------
  161. static void DoClick(EventRecord *evt)
  162. {
  163.     WindowPtr    w;
  164.     
  165.     switch (FindWindow(evt->where, &w)) {
  166.         case inDesk:        break;
  167.         case inMenuBar:        UpdateMenus();
  168.                             DoMenu(MenuSelect(evt->where));
  169.                             break;
  170.         case inSysWindow:    SystemClick(evt, w);
  171.                             break;
  172.         case inContent:        if (w != FrontWindow())
  173.                                 SelectWindow(w);
  174.                             else {
  175.                                 SetPort(w);
  176.                                 DoClickInContent(evt, w);
  177.                             }
  178.                             break;
  179.         case inDrag:        DragWindow(w, evt->where, &qd.screenBits.bounds);
  180.                             break;
  181.         case inGoAway:        if (TrackGoAway(w, evt->where))
  182.                                 DoClose();
  183.                             break;
  184.         default:            break;
  185.     }
  186. }
  187.  
  188.  
  189.  
  190. //------------------------------------
  191. static void UpdateMenus(void)
  192. {
  193.     MenuHandle    menu = GetMenuHandle(mFile);
  194.     if (PreflightNew()) // application-specific
  195.         EnableItem(menu, iNew);
  196.     else
  197.         DisableItem(menu, iNew);
  198.     if (FrontWindow())
  199.         EnableItem(menu, iClose);
  200.     else
  201.         DisableItem(menu, iClose);
  202.     UpdateAppMenus();
  203. }
  204.  
  205.  
  206. //------------------------------------
  207. static void DoMenu(long msel)
  208. {
  209.     short item = LoWord(msel);
  210.     short menu = HiWord(msel);
  211.  
  212.     switch (menu) {
  213.         case mApple: ChooseApple(item);        break;
  214.         case mFile : ChooseFile(item);        break;
  215.         case mEdit : ChooseEdit(item);        break;
  216.         default :     DoAppSpecificMenu(menu, item); // app-specific
  217.     }
  218.     HiliteMenu(0);
  219. }
  220.  
  221.  
  222. //------------------------------------
  223. static void ChooseApple(short itemNumber)
  224. {
  225.     short dontCare;
  226.     
  227.     if (itemNumber == iAbout)
  228.     {
  229.         dontCare = Alert(aboutBoxID, nil);
  230.     } 
  231.     else 
  232.     {
  233.         GrafPtr        savePort;
  234.         Str255        daName;
  235.         short        daRefNum;
  236.         
  237.         GetPort(&savePort);
  238.         GetMenuItemText(GetMenuHandle(mApple), itemNumber, daName);
  239.         daRefNum = OpenDeskAcc(daName);
  240.         SetPort(savePort);
  241.     }
  242. }
  243.  
  244. //------------------------------------
  245. static void ChooseFile(short item)
  246. {
  247.     switch(item) {
  248.         case iNew    :        DoNew();
  249.             break;
  250.         case iOpen    :        DoOpen();
  251.             break;
  252.         case iClose    :        DoClose();
  253.             break;
  254.         case iSave    :        DoSave();
  255.             break;
  256.         case iSaveAs:        DoSaveAs();
  257.             break;
  258.         case iPageSetup    :    DoPageSetup();
  259.             break;
  260.         case iPrint    :        DoPrint();
  261.             break;
  262.         case iQuit    :        gDone = true;
  263.             break;
  264.     }
  265. }
  266.  
  267. //------------------------------------
  268. static void ChooseEdit(short item)
  269. // Does not support edit menu right now
  270. {
  271.     SystemEdit(item-1);
  272. }
  273.  
  274.  
  275. //------------------------------------
  276. static void DoPageSetup( void )
  277. {
  278.     Boolean    ignore;
  279.     short    err;
  280.     
  281.     PrOpen();
  282.     if ((err = PrError()) != 0) {
  283.         ErrMsgCode("\p PrOpen failed.",err);
  284.         return;
  285.     }
  286.     ignore = PrStlDialog(gPrintH);
  287.     PrClose();
  288. }
  289.  
  290.  
  291. //-------------------------------
  292. static OSErr InstallAEHandlers(void)
  293. {
  294.     OSErr    err;
  295.     
  296.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerProc(AEOpenHandler), 0, false);
  297.     if ( err ) goto problem;
  298.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerProc(AEOpenDocHandler), 0, false);
  299.     if ( err ) goto problem;
  300.     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerProc(AEQuitHandler), 0, false);
  301.     if ( err ) goto problem;
  302.     err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerProc(AEPrintHandler), 0, false);
  303.     if ( err ) goto problem;
  304.     return noErr;
  305.     
  306. problem:
  307.     ErrMsgCode("\pError installing AppleEvent handlers.", err);
  308.     return err;
  309. }
  310.  
  311. // ------------------------------------------------------------------------- 
  312. static pascal OSErr AEOpenHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  313. {
  314.     return ( noErr );
  315. }
  316.  
  317. static pascal OSErr AEOpenDocHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  318. {
  319.     return ( noErr );
  320. }
  321.  
  322. static pascal OSErr AEPrintHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  323. {
  324.     return ( noErr );
  325. }
  326.  
  327. static pascal OSErr AEQuitHandler(AppleEvent *messagein, AppleEvent *reply, long refIn)
  328. {
  329.     gDone = true;
  330.     return ( noErr );
  331. }
  332. // ------------------------------------------------------------------------- 
  333.  
  334.  
  335. //----------------------------------------------------
  336. // Error handling
  337. #define KEEP_GOING 1
  338. #define DEBUGGER 2
  339. #define EXITTOSHELL 3
  340.  
  341. static void Msg(Str255 msg) // Display an Alert with the string passed.
  342. {
  343.     ParamText(msg,nil,nil,nil);
  344.     Alert(130, nil);
  345. }
  346.  
  347. void ErrMsgCode(Str255 msg, short code)
  348. //    Display error alert with error code. Will also display MemErr and ResErr for you.
  349.     Str31    codeStr;
  350.     Str31    memErrStr;
  351.     Str31    resErrStr;
  352.     short    disposition;
  353.     
  354.     if (code)
  355.         NumToString(code, codeStr);
  356.     else
  357.         codeStr[0] = 0;
  358.     NumToString(LMGetMemErr(), memErrStr);
  359.     NumToString(LMGetResErr(), resErrStr);
  360.     ParamText(msg, codeStr, memErrStr, resErrStr);
  361.     disposition = Alert(128, nil);
  362.     
  363.     switch (disposition)
  364.     {
  365.         case    KEEP_GOING:        return; break;
  366.         case    DEBUGGER:        DebugStr("\p Doing a Stack Crawl;sc6"); break;
  367.         case    EXITTOSHELL:    ExitToShell(); break;
  368.     }
  369. }
  370.  
  371. //----------------------------------------------------
  372. void ErrMsg(Str255 msg) // No error code desired.
  373. {
  374.     ErrMsgCode(msg, 0);
  375. }
  376.  
  377.  
  378. //------------------------------------
  379. void pcat(StringPtr d, StringPtr s)
  380. {
  381.     short    i, j;
  382.  
  383.     if (((j = s[0]) + d[0]) > 255)
  384.         j = 255 - d[0]; // Limit dest string to 255
  385.  
  386.     for (i = 0; i < j;) d[++d[0]] = s[++i];
  387. }
  388.